home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Sprite 1984 - 1993
/
Sprite 1984 - 1993.iso
/
src
/
machserver
/
1.098
/
fscache
/
fscache.h
< prev
next >
Wrap
C/C++ Source or Header
|
1991-03-30
|
23KB
|
605 lines
/*
* fscache.h --
*
* Declarations of interface to the Sprite file system cache.
*
* Copyright 1989 Regents of the University of California
* Permission to use, copy, modify, and distribute this
* software and its documentation for any purpose and without
* fee is hereby granted, provided that the above copyright
* notice appear in all copies. The University of California
* makes no representations about the suitability of this
* software for any purpose. It is provided "as is" without
* express or implied warranty.
*
* $Header: /sprite/src/kernel/fscache/RCS/fscache.h,v 9.13 91/03/30 17:08:16 mgbaker Exp $ SPRITE (Berkeley)
*/
#ifndef _FSCACHE
#define _FSCACHE
#include <sync.h>
#include <list.h>
#include <fs.h>
#include <user/time.h>
/* data structures */
/*
* Cache information for each file.
*/
typedef struct Fscache_Attributes {
int firstByte; /* Cached version of desc. firstByte */
int lastByte; /* Cached version of desc. lastByte */
int accessTime; /* Cached version of access time */
int modifyTime; /* Cached version of modify time */
int createTime; /* Create time (won't change, but passed
* to clients for use in
* statistics-gathering) */
int userType; /* user advisory file type, defined in
* user/fs.h */
/*
* The following fields are needed by Proc_Exec.
*/
int permissions; /* File permissions */
int uid; /* User ID of owner */
int gid; /* Group Owner ID */
} Fscache_Attributes;
/*
* Structure to represent a cache block in the fileservers cache block
* list and the core map list.
*/
typedef struct Fscache_FileInfo {
List_Links links; /* Links for the list of dirty files.
THIS MUST BE FIRST in the struct */
List_Links dirtyList; /* List of dirty blocks for this file.
* THIS MUST BE SECOND, see the macro
* in fsBlockCache.c that depends on it. */
List_Links blockList; /* List of blocks for the file */
List_Links indList; /* List of indirect blocks for the file */
Sync_Lock lock; /* This is used to serialize cache access */
int flags; /* Flags to indicate the state of the
file, defined below. */
int version; /* Used to verify validity of cached data */
struct Fs_HandleHeader *hdrPtr; /* Back pointer to I/O handle */
int blocksInCache; /* The number of blocks that this file has
in the cache. */
int blocksWritten; /* The number of blocks that have been
* written in a row without requiring a
* sync of the servers cache. */
int numDirtyBlocks; /* The number of dirty blocks in the cache.*/
Sync_Condition noDirtyBlocks; /* Notified when all write backs done. */
int lastTimeTried; /* Time that last tried to see if disk was
* available for this block. */
int oldestDirtyBlockTime;
Fscache_Attributes attr; /* Local version of descriptor attributes. */
struct Fscache_Backend *backendPtr;
/* Routines for read/write/allocate/copy. */
} Fscache_FileInfo;
/*
* Values for flags field in the Fscache_FileInfo struct.
*
* FSCACHE_CLOSE_IN_PROGRESS There is a close being done on this file so
* no more delayed writes are allowed.
* FSCACHE_SERVER_DOWN The host that this file belongs is down.
* FSCACHE_NO_DISK_SPACE The domain that this file lives in has no
* disk space.
* FSCACHE_DOMAIN_DOWN The domain to write to is not available.
* FSCACHE_GENERIC_ERROR An error occured for which we just hang onto
* file blocks until we can write them out.
* FSCACHE_SYNC_DONE The server has been told to force all blocks
* for this file to disk.
* FSCACHE_FILE_BEING_WRITTEN There already is a block cleaner working on
* this process.
* FSCACHE_FILE_ON_DIRTY_LIST This file is on the dirty list.
* FSCACHE_WRITE_TO_DISK Want file forced to disk.
* FSCACHE_FILE_NOT_CACHEABLE This is set when files served by remote hosts
* are no longer caching because of write sharing
* or because the file is a directory.
* FSCACHE_LARGE_FILE_MODE This file is large enough such that we limit it
* to only a few blocks in the cache.
* FSCACHE_FILE_GONE The file has been removed and any delayed
* writes should be discarded.
#ifdef SOSP91
* FSCACHE_IS_DIR File not cacheable because it's a directory.
#endif SOSP91
* FSCACHE_ALLOC_FAILED Allocated failed due to disk full. This
* is used to throttle error messages.
* FSCACHE_FILE_BEING_CLEANED
*/
#define FSCACHE_CLOSE_IN_PROGRESS 0x0001
#define FSCACHE_SERVER_DOWN 0x0002
#define FSCACHE_NO_DISK_SPACE 0x0004
#define FSCACHE_DOMAIN_DOWN 0x0008
#define FSCACHE_GENERIC_ERROR 0x0010
#define FSCACHE_SYNC_DONE 0x0020
#define FSCACHE_FILE_BEING_WRITTEN 0x0040
#define FSCACHE_FILE_ON_DIRTY_LIST 0x0080
#define FSCACHE_WRITE_TO_DISK 0x0100
#define FSCACHE_FILE_NOT_CACHEABLE 0x0200
#define FSCACHE_LARGE_FILE_MODE 0x0400
#define FSCACHE_FILE_GONE 0x0800
/* There's space for a new flag in here. */
#ifdef SOSP91
#define FSCACHE_IS_DIR 0x1000
#endif /* SOSP91 */
#define FSCACHE_ALLOC_FAILED 0x2000
#define FSCACHE_FILE_FSYNC 0x4000
#define FSCACHE_FILE_DESC_DIRTY 0x8000
#define FSCACHE_FILE_BEING_CLEANED 0x10000
#ifdef SOSP91
/*
* The counters of why bytes leave the cache.
*/
#define FSCACHE_REASON_FLAGS 0xFFF00000
#define FSCACHE_CONSIST_WB 0x00100000
#define FSCACHE_CONSIST_WBINV 0x00200000
#define FSCACHE_SYNC 0x00400000
#define FSCACHE_REOPEN 0x00800000
#define FSCACHE_DETACH 0x01000000
#define FSCACHE_DESC 0x02000000
#define FSCACHE_TIME 0x04000000
#define FSCACHE_SPACE 0x08000000
#define FSCACHE_VM 0x10000000
#define FSCACHE_SHRINK 0x20000000
#define FSCACHE_LRU 0x40000000
typedef struct Fscache_ExtraStats {
unsigned int consistWB;
unsigned int cwbDLife;
unsigned int consistWBInv;
unsigned int cwbiDLife;
unsigned int sync;
unsigned int syncDLife;
unsigned int reopen;
unsigned int reDLife;
unsigned int detach;
unsigned int detDLife;
unsigned int desc;
unsigned int descDLife;
unsigned int time;
unsigned int timeDLife;
unsigned int space;
unsigned int spaceDLife;
unsigned int vm;
unsigned int vmDLife;
unsigned int shrink;
unsigned int shrinkDLife;
unsigned int lru;
unsigned int lruDLife;
unsigned int unknown;
unsigned int unDLife;
unsigned int cleanVm;
unsigned int cVmLife;
unsigned int unRcleanVm;
unsigned int cleanShrink;
unsigned int cShrinkLife;
unsigned int unRcleanShrink;
unsigned int cleanLru;
unsigned int cLruLife;
unsigned int unRcleanLru;
} Fscache_ExtraStats;
extern Fscache_ExtraStats fscache_ExtraStats;
#endif SOSP91
/*
* Structure to represent a cache block in the fileservers cache block
* list and the core map list.
*/
typedef struct Fscache_Block {
List_Links dirtyLinks; /* Links to put block into list of dirty
* blocks for the file. THIS MUST BE FIRST
* in the struct. It may be used by the
* cache backend's after a Fetch_DirtyBlock
* call. */
List_Links useLinks; /* Links to put block into list of unused
cache blocks or LRU list of cache blocks.
THIS MUST BE SECOND in the struct. */
List_Links fileLinks; /* Links to put block into list of blocks
* for the file. There are two lists, either
* regular or for indirect blocks. */
time_t timeDirtied; /* Time in seconds that block was
dirtied if at all. */
time_t timeReferenced; /* Time in seconds that this block was
* last referenced. */
Address blockAddr; /* Kernel virtual address where data for
cache block is at. */
Fscache_FileInfo *cacheInfoPtr; /* Reference to file's cache info. */
int fileNum; /* For consistency checks */
int blockNum; /* The number of this block in the file. */
int diskBlock; /* The block number on disk for this block.
For remote blocks this equals blockNum. */
int blockSize; /* The number of valid bytes in this block. */
int refCount; /* Number of times that the block is referenced.
0 means is unreferenced. */
Sync_Condition ioDone; /* Notified when block is unlocked after I/O */
int flags; /* Flags to indicate state of block. */
} Fscache_Block;
/*
* Flags for a Fscache_Block:
*
* FSCACHE_BLOCK_FREE The block is not being used.
* FSCACHE_BLOCK_ON_DIRTY_LIST The block is on the dirty list.
* FSCACHE_BLOCK_BEING_WRITTEN The block is in the process of being
* written to disk.
* FSCACHE_BLOCK_DIRTY The block contains dirty data.
* FSCACHE_BLOCK_DELETED This block has been deleted. This
* flag is set when a block is to be
* invalidated after it has been cleaned.
* FSCACHE_MOVE_TO_FRONT After this block has finished being
* cleaned move it to the front of the
* LRU list.
* FSCACHE_WRITE_BACK_WAIT This block is being written out by
* FsCacheWriteBack which is waiting
* for all such blocks to be written out.
* FSCACHE_BLOCK_WRITE_LOCKED This block is being modified.
* FSCACHE_BLOCK_NEW This block was just created.
* FSCACHE_BLOCK_CLEANER_WAITING The block cleaner is waiting for this
* block to become unlocked in order to
* write it out.
* FSCACHE_NOT_MAPPED This cache block does not have
* physical memory behind it.
* FSCACHE_IND_BLOCK This block is an indirect block.
* FSCACHE_DESC_BLOCK This block is a file descriptor block.
* FSCACHE_DIR_BLOCK This is a directory block.
* FSCACHE_DATA_BLOCK This is a data block.
* FSCACHE_READ_AHEAD_BLOCK This block was read ahead.
* FSCACHE_IO_IN_PROGRESS IO is in progress on this block.
* FSCACHE_CANT_BLOCK
* FSCACHE_DONT_BLOCK Don't block if the cache block is
* already locked.
* FSCACHE_PIPE_BLOCK This is a block that is permanently
* locked so that it can serve as the
* data area for a pipe. (NOT USED)
* FSCACHE_WRITE_THRU_BLOCK This block is being written through by
* the caller to Fscache_UnlockBlock.
* FSCACHE_BLOCK_BEING_CLEANED The block is being cleaned.
*/
#define FSCACHE_BLOCK_FREE 0x000001
#define FSCACHE_BLOCK_ON_DIRTY_LIST 0x000002
#define FSCACHE_BLOCK_BEING_WRITTEN 0x000004
#define FSCACHE_BLOCK_DIRTY 0x000008
#define FSCACHE_BLOCK_DELETED 0x000010
#define FSCACHE_MOVE_TO_FRONT 0x000020
#define FSCACHE_WRITE_BACK_WAIT 0x000040
#define FSCACHE_BLOCK_WRITE_LOCKED 0x000100
#define FSCACHE_BLOCK_NEW 0x000200
#define FSCACHE_BLOCK_CLEANER_WAITING 0x000400
#define FSCACHE_NOT_MAPPED 0x000800
#define FSCACHE_IND_BLOCK 0x001000
#define FSCACHE_DESC_BLOCK 0x002000
#define FSCACHE_DIR_BLOCK 0x004000
#define FSCACHE_DATA_BLOCK 0x008000
#define FSCACHE_READ_AHEAD_BLOCK 0x010000
#define FSCACHE_IO_IN_PROGRESS 0x020000
#define FSCACHE_DONT_BLOCK 0x040000
#define FSCACHE_PIPE_BLOCK 0x080000
#define FSCACHE_WRITE_THRU_BLOCK 0x100000
#define FSCACHE_CANT_BLOCK 0x200000
#define FSCACHE_BLOCK_BEING_CLEANED 0x400000
#ifdef SOSP91
#define FSCACHE_BLOCK_REASON 0xFF000000
#define FSCACHE_BLOCK_LRU 0x01000000
#define FSCACHE_BLOCK_VM 0x02000000
#define FSCACHE_BLOCK_SHRINK 0x04000000
#endif SOSP91
/*
* Macro to get the block address field of the Fscache_Block struct.
*/
#define Fscache_BlockAddress(cacheBlockPtr) ((cacheBlockPtr)->blockAddr)
/*
* Constant to pass to Fscache_FileWriteBack, which takes block numbers as
* arguments.
*/
#define FSCACHE_LAST_BLOCK -1
/*
* Constants to pass as flags to Fscache_FileWriteBack.
*
* FSCACHE_FILE_WB_WAIT Wait for blocks to be written back.
* FSCACHE_WRITE_BACK_INDIRECT Write back indirect blocks.
* FSCACHE_WRITE_BACK_AND_INVALIDATE Invalidate after writing back.
* FSCACHE_WB_MIGRATION Invalidation due to migration (for
* statistics purposes only).
* FSCACHE_WRITE_BACK_DESC_ONLY Only writeback the descriptor.
*/
#define FSCACHE_FILE_WB_WAIT 0x1
#define FSCACHE_WRITE_BACK_INDIRECT 0x2
#define FSCACHE_WRITE_BACK_AND_INVALIDATE 0x4
#define FSCACHE_WB_MIGRATION 0x8
#define FSCACHE_WRITE_BACK_DESC_ONLY 0x10
/*
* Constants to pass as flags to FsUnlockCacheBlock.
*
* FSCACHE_DELETE_BLOCK The block should be deleted when it is unlocked.
* FSCACHE_CLEAR_READ_AHEAD Clear the read ahead flag from the block.
* FSCACHE_BLOCK_UNNEEDED This block is not needed anymore. Throw it away
* as soon as possible.
* FSCACHE_DONT_WRITE_THRU Don't write this block through to disk.
*
* Also can pass one of the 4 block types defined above (0x1000 - 0x8000).
*/
#define FSCACHE_DELETE_BLOCK 0x0001
#define FSCACHE_CLEAR_READ_AHEAD 0x0002
#define FSCACHE_BLOCK_UNNEEDED 0x0004
#define FSCACHE_DONT_WRITE_THRU 0x0008
/*
* Flags for Fscache_Trunc
* FSCACHE_TRUNC_DELETE Truncate because the file is deleted. This
* is used to prevent delayed writes during the
* truncation of the file.
*/
#define FSCACHE_TRUNC_DELETE 0x1
typedef struct Fscache_BackendRoutines {
/*
* FooAllocate(hdrPtr, offset, bytes, flags, blockAddrPtr, newBlockPtr)
* Fs_HandleHeader *hdrPtr; (File handle)
* int offset; (Byte offset)
* int bytes; (Bytes to allocate)
* int flags; (FSCACHE_DONT_BLOCK)
* int *blockAddrPtr; (Returned block number)
* Boolean *newBlockPtr; (TRUE if new block)
* FooTruncate(hdrPtr, size, delete)
* Fs_HandleHeader *hdrPtr; (File handle)
* int size; (New size)
* Boolean delete; (TRUE if file being
* removed)
* FooBlockRead(hdrPtr, blockPtr,remoteWaitPtr)
* Fs_HandleHeader *hdrPtr; (File handle)
* Fscache_Block *blockPtr; (Cache block to read)
* Sync_RemoteWaiter *remoteWaitPtr; (For remote waiting)
* FooBlockWrite(hdrPtr, blockPtr, lastDirtyBlock)
* Boolean lastDirtyBlock; (Indicates last block)
* FooReallocBlock(data, callInfoPtr)
* ClientData data = blockPtr; (Cache block to realloc)
* Proc_CallInfo *callInfoPtr;
* FooStartWriteBack(backendPtr)
* Fscache_Backend *backendPtr; (Backend to start writeback.)
*/
ReturnStatus (*allocate) _ARGS_((Fs_HandleHeader *hdrPtr, int offset,
int numBytes, int flags, int *blockAddrPtr,
Boolean *newBlockPtr));
ReturnStatus (*truncate) _ARGS_((Fs_HandleHeader *hdrPtr, int size,
Boolean delete));
ReturnStatus (*blockRead) _ARGS_((Fs_HandleHeader *hdrPtr,
Fscache_Block *blockPtr,
Sync_RemoteWaiter *remoteWaitPtr));
ReturnStatus (*blockWrite) _ARGS_((Fs_HandleHeader *hdrPtr,
Fscache_Block *blockPtr, int flags));
void (*reallocBlock) _ARGS_((ClientData data,
Proc_CallInfo *callInfoPtr));
ReturnStatus (*startWriteBack) _ARGS_((struct Fscache_Backend *backendPtr));
} Fscache_BackendRoutines;
/*
* Routines and data structures defining a backend to the cache.
*/
typedef struct Fscache_Backend {
List_Links cacheLinks; /* Used by fscacheBlocks.c to link backends
* onto a list. Must be first in structure! */
int flags; /* See below. */
ClientData clientData; /* ClientData for the backend. */
List_Links dirtyListHdr; /* List of dirty files for this backend. */
Fscache_BackendRoutines ioProcs; /* Routines for backend. */
} Fscache_Backend;
/*
* Read-ahead is used for both local and remote files that are cached.
* The following structure is used to synchronize read ahead with other I/O.
*/
typedef struct Fscache_ReadAheadInfo {
Sync_Lock lock; /* Access to this state is monitored */
int count; /* Number of read aheads in progress */
Boolean blocked; /* TRUE if read ahead is blocked */
Sync_Condition done; /* Notified when there are no more read
* aheads in progress. */
Sync_Condition okToRead; /* Notified when there are no more
* conflicts with read ahead. */
} Fscache_ReadAheadInfo; /* 24 BYTES */
#define FSCACHE_NUM_DOMAIN_TYPES 2
#ifndef CLEAN
#define FSCACHE_DEBUG_PRINT(string) \
if (fsconsist_Debug) {\
printf(string);\
}
#define FSCACHE_DEBUG_PRINT1(string, arg1) \
if (fsconsist_Debug) {\
printf(string, arg1);\
}
#define FSCACHE_DEBUG_PRINT2(string, arg1, arg2) \
if (fsconsist_Debug) {\
printf(string, arg1, arg2);\
}
#define FSCACHE_DEBUG_PRINT3(string, arg1, arg2, arg3) \
if (fsconsist_Debug) {\
printf(string, arg1, arg2, arg3);\
}
#else
#define FSCACHE_DEBUG_PRINT(string)
#define FSCACHE_DEBUG_PRINT1(string, arg1)
#define FSCACHE_DEBUG_PRINT2(string, arg1, arg2)
#define FSCACHE_DEBUG_PRINT3(string, arg1, arg2, arg3)
#endif not CLEAN
/*
* The cache uses a number of Proc_ServerProcs to do write-backs.
* FSCACHE_MAX_CLEANER_PROCS defines the maximum number, and this
* is used to configure the right number of Proc_ServerProcs.
*/
#define FSCACHE_MAX_CLEANER_PROCS 3
extern int fscache_MaxBlockCleaners;
extern Boolean fscache_RATracing;
extern int fscache_NumReadAheadBlocks;
extern List_Links *fscacheFullWaitList;
/* procedures */
/*
* Block Cache routines.
*/
#ifdef SOSP91
extern void Fscache_AddBlockToStats _ARGS_((Fscache_FileInfo *cacheInfoPtr, Fscache_Block *blockPtr));
extern void Fscache_AddCleanStats _ARGS_((unsigned int flags, Fscache_Block *blockPtr));
#endif SOSP91
extern void Fscache_WriteBack _ARGS_((unsigned int writeBackTime,
int *blocksSkippedPtr, Boolean writeBackAll));
extern ReturnStatus Fscache_FileWriteBack _ARGS_((
Fscache_FileInfo *cacheInfoPtr, int firstBlock,
int lastBlock, int flags, int *blocksSkippedPtr));
extern void Fscache_FileInvalidate _ARGS_((Fscache_FileInfo *cacheInfoPtr,
int firstBlock, int lastBlock));
extern void Fscache_Empty _ARGS_((int *numLockedBlocksPtr));
extern void Fscache_CheckFragmentation _ARGS_((int *numBlocksPtr,
int *totalBytesWastedPtr, int *fragBytesWastedPtr));
extern ReturnStatus Fscache_CheckVersion _ARGS_((
Fscache_FileInfo *cacheInfoPtr, int version,
int clientID));
extern ReturnStatus Fscache_Consist _ARGS_((
Fscache_FileInfo *cacheInfoPtr, int flags,
Fscache_Attributes *cachedAttrPtr));
extern void Fscache_SetMinSize _ARGS_((int minBlocks));
extern void Fscache_SetMaxSize _ARGS_((int maxBlocks));
extern void Fscache_BlocksUnneeded _ARGS_((Fs_Stream *streamPtr,
int offset, int numBytes, Boolean objectFile));
extern void Fscache_DumpStats _ARGS_((ClientData dummy));
extern void Fscache_GetPageFromFS _ARGS_((time_t timeLastAccessed,
int *pageNumPtr));
extern void Fscache_FileInfoInit _ARGS_((Fscache_FileInfo *cacheInfoPtr,
Fs_HandleHeader *hdrPtr, int version, Boolean cacheable,
Fscache_Attributes *attrPtr, Fscache_Backend *backendPtr));
extern void Fscache_InfoSyncLockCleanup _ARGS_((Fscache_FileInfo *cacheInfoPtr));
extern Fscache_Backend *Fscache_RegisterBackend _ARGS_((
Fscache_BackendRoutines *ioProcsPtr, ClientData clientData,
int flags));
extern void Fscache_UnregisterBackend _ARGS_((Fscache_Backend *backendPtr));
extern void Fscache_FetchBlock _ARGS_((Fscache_FileInfo *cacheInfoPtr,
int blockNum, int flags, Fscache_Block **blockPtrPtr,
Boolean *foundPtr));
extern void Fscache_IODone _ARGS_((Fscache_Block *blockPtr));
extern void Fscache_UnlockBlock _ARGS_((Fscache_Block *blockPtr,
time_t timeDirtied, int diskBlock, int blockSize,
int flags));
extern void Fscache_BlockTrunc _ARGS_((Fscache_FileInfo *cacheInfoPtr,
int blockNum, int newBlockSize));
extern void Fscache_Init _ARGS_((int blockHashSize));
extern int Fscache_PreventWriteBacks _ARGS_((Fscache_FileInfo *cacheInfoPtr));
extern void Fscache_AllowWriteBacks _ARGS_((Fscache_FileInfo *cacheInfoPtr));
extern Fscache_FileInfo *Fscache_GetDirtyFile _ARGS_((
Fscache_Backend *backendPtr, Boolean fsyncOnly,
Boolean (*fileMatchProc)(), ClientData clientData));
extern void Fscache_ReturnDirtyFile _ARGS_((Fscache_FileInfo *cacheInfoPtr,
Boolean onFront));
extern Fscache_Block *Fscache_GetDirtyBlock _ARGS_((
Fscache_FileInfo *cacheInfoPtr,
Boolean (*blockMatchProc)(Fscache_Block *blockPtr,
ClientData clientData),
ClientData clientData, int *lastDirtyBlockPtr));
extern void Fscache_ReturnDirtyBlock _ARGS_((Fscache_Block *blockPtr,
ReturnStatus status));
extern ReturnStatus Fscache_PutFileOnDirtyList _ARGS_((
Fscache_FileInfo *cacheInfoPtr, int flags));
extern ReturnStatus Fscache_RemoveFileFromDirtyList _ARGS_((
Fscache_FileInfo *cacheInfoPtr));
/*
* Cache operations. There are I/O operations, plus routines to deal
* with the cached I/O attributes like access time, modify time, and size.
*/
extern ReturnStatus Fscache_Read _ARGS_((Fscache_FileInfo *cacheInfoPtr,
int flags, register Address buffer, int offset, int *lenPtr,
Sync_RemoteWaiter *remoteWaitPtr));
extern ReturnStatus Fscache_Write _ARGS_((Fscache_FileInfo *cacheInfoPtr,
int flags, Address buffer, int offset, int *lenPtr,
Sync_RemoteWaiter *remoteWaitPtr));
extern ReturnStatus Fscache_BlockRead _ARGS_((Fscache_FileInfo *cacheInfoPtr,
int blockNum, Fscache_Block **blockPtrPtr, int *numBytesPtr,
int blockType, Boolean allocate));
extern ReturnStatus Fscache_Trunc _ARGS_((Fscache_FileInfo *cacheInfoPtr,
int length, int flags));
extern Boolean Fscache_UpdateFile _ARGS_((Fscache_FileInfo *cacheInfoPtr,
Boolean openForWriting, int version, Boolean cacheable,
Fscache_Attributes *attrPtr));
extern void Fscache_UpdateAttrFromClient _ARGS_((int clientID,
Fscache_FileInfo *cacheInfoPtr, Fscache_Attributes *attrPtr));
extern void Fscache_UpdateDirSize _ARGS_((Fscache_FileInfo *cacheInfoPtr,
int newLastByte));
extern void Fscache_UpdateAttrFromCache _ARGS_((Fscache_FileInfo *cacheInfoPtr,
Fs_Attributes *attrPtr));
extern void Fscache_GetCachedAttr _ARGS_((Fscache_FileInfo *cacheInfoPtr,
int *versionPtr, Fscache_Attributes *attrPtr));
extern void Fscache_UpdateCachedAttr _ARGS_((Fscache_FileInfo *cacheInfoPtr,
Fs_Attributes *attrPtr, int flags));
extern Boolean Fscache_OkToScavenge _ARGS_((Fscache_FileInfo *cacheInfoPtr));
extern int Fscache_ReserveBlocks _ARGS_((Fscache_Backend *backendPtr,
int numResBlocks, int numNonResBlocks));
extern void Fscache_ReleaseReserveBlocks _ARGS_((Fscache_Backend *backendPtr,
int numBlocks));
/*
* Read ahead routines.
*/
extern void Fscache_ReadAheadInit _ARGS_((Fscache_ReadAheadInfo *readAheadPtr));
extern void Fscache_ReadAheadSyncLockCleanup _ARGS_((
Fscache_ReadAheadInfo *readAheadPtr));
extern void FscacheReadAhead _ARGS_((Fscache_FileInfo *cacheInfoPtr,
int blockNum));
extern void Fscache_WaitForReadAhead _ARGS_((
Fscache_ReadAheadInfo *readAheadPtr));
extern void Fscache_AllowReadAhead _ARGS_((Fscache_ReadAheadInfo *readAheadPtr));
extern void FscacheReadAhead _ARGS_((Fscache_FileInfo *cacheInfoPtr,
int blockNum));
extern void FscacheBackendIdle _ARGS_((Fscache_Backend *backendPtr));
extern void FscacheFinishRealloc _ARGS_((Fscache_Block *blockPtr,
int diskBlock));
extern void Fscache_CountBlocks _ARGS_((int serverID, int majorNumber,
int *numBlocksPtr, int *numDirtyBlocksPtr));
#endif /* _FSCACHE */